new 对象过程

类加载过程

首先在常量池找类符号引用,未找到则进行类加载

加载

类加载遵循双亲委派模式

验证

加载完成进行class规范验证

准备

在方法区给静态变量分配内存空间,赋初始值(常量直接赋值)

解析

将常量池中类符号引用转为直接引用、解析需要静态绑定的内容(所有不会被重写的方法都会被静态绑定)

验证、准备、解析(链接阶段),要做的就是将加载到JVM中的二进制字节流的类数据,合并到JVM运行时状态中

初始化

给静态变量赋值,执行静态代码块(static{...})

创建对象

1、虚拟机为对象分配堆内存(指针碰撞、空闲列表)

2、设置对象头信息(类的元数据信息、对象的GC分代年龄信息)

3、给实例变量赋默认值

4、执行实例代码块({...})、构造器方法,先父类后子类

5、Child c = new Child(); 在虚拟机栈定义Child类型引用变量c,将堆区对象地址赋值给它

虚方法表

1、通过对象调用方法时,先在方法区中对象的类信息找,找不到去父类信息找

2、类加载时,创建一个虚方法表,每个方法只有一条记录,重写方法保留子类的,不需要往上搜索父类,优化调用效率

浙ICP备11005866号-12